Docker版OWASP ZAPを使用してWebアプリの簡易的な脆弱性診断をしてみた
こんにちは、CX事業本部の若槻です。
最近Webアプリケーション向けのセキュリティ診断ツールについて調べてみたところ、OWASP ZAPというオープンソースツールが定番としてよく使われているそうです。
今回は、Docker版OWASP ZAPを使用してWebアプリのログインページの簡易的な脆弱性診断を行ってみました。
なぜDocker版を使ったのか
OWASP ZAPにはWindows、Mac、Linuxで使えるインストーラー版およびパッケージ版と、Docker版があります。
当初はMac向けインストーラー版を使おうとしましたが、Macのセキュリティによりインストールできなかったため断念しました。
よってインストールを要しないDocker版を使うこととしました。
やってみた
今回は次のようなAmplify(CloudFront) + Reactにより実装したログインページを診断対象としました。
コマンドでDockerイメージowasp/zap2docker-stable
をプルします。
% docker pull owasp/zap2docker-stable Using default tag: latest latest: Pulling from owasp/zap2docker-stable 423ae2b273f4: Pull complete de83a2304fa1: Pull complete f9a83bce3af0: Pull complete b6b53be908de: Pull complete dfa4c0ed9f01: Pull complete 0d0271dc7f26: Pull complete ba10134fb40f: Pull complete a5566afd045d: Pull complete 7b60e2849bd0: Pull complete daf051f52216: Pull complete 3600cd933995: Pull complete a1d63c5e9c9f: Pull complete 86279da9d5e1: Pull complete 61d20517a689: Pull complete b645cc4494b6: Pull complete 87a41273fa00: Pull complete dcd8983ba399: Pull complete 424fa8727c16: Pull complete Digest: sha256:3563ecc53448ad224262ccea185cff8360c999c52d9c4b78630d9344dc1c3fd6 Status: Downloaded newer image for owasp/zap2docker-stable:latest docker.io/owasp/zap2docker-stable:latest
Docker版ZAPのスキャンタイプにはいくつかの種類がありますが、今回は攻撃および負荷のあるアクセスを伴わない1分間の静的スキャンを実施するBaseline Scanを行いました。次のコマンドで実行が可能です。
docker run -t owasp/zap2docker-stable zap-baseline.py -t <対象ページのURL>
ログインページhttps://example.com/login
に対してBaseline Scanを実行してみます。
% docker run -t owasp/zap2docker-stable zap-baseline.py -t https://example.com/login 2020-09-10 09:03:38,813 Params: ['zap-x.sh', '-daemon', '-port', '38996', '-host', '0.0.0.0', '-config', 'api.disablekey=true', '-config', 'api.addrs.addr.name=.*', '-config', 'api.addrs.addr.regex=true', '-config', 'spider.maxDuration=1', '-addonupdate', '-addoninstall', 'pscanrulesBeta'] _XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created. Sep 10, 2020 9:03:40 AM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. Total of 13 URLs PASS: Cookie No HttpOnly Flag [10010] PASS: Cookie Without Secure Flag [10011] PASS: Cross-Domain JavaScript Source File Inclusion [10017] PASS: Content-Type Header Missing [10019] PASS: X-Frame-Options Header Scanner [10020] PASS: X-Content-Type-Options Header Missing [10021] PASS: Information Disclosure - Debug Error Messages [10023] PASS: Information Disclosure - Sensitive Information in URL [10024] PASS: Information Disclosure - Sensitive Information in HTTP Referrer Header [10025] PASS: HTTP Parameter Override [10026] PASS: Information Disclosure - Suspicious Comments [10027] PASS: Open Redirect [10028] PASS: Cookie Poisoning [10029] PASS: User Controllable Charset [10030] PASS: User Controllable HTML Element Attribute (Potential XSS) [10031] PASS: Viewstate Scanner [10032] PASS: Directory Browsing [10033] PASS: Heartbleed OpenSSL Vulnerability (Indicative) [10034] PASS: Strict-Transport-Security Header Scanner [10035] PASS: HTTP Server Response Header Scanner [10036] PASS: Server Leaks Information via "X-Powered-By" HTTP Response Header Field(s) [10037] PASS: X-Backend-Server Header Information Leak [10039] PASS: Secure Pages Include Mixed Content [10040] PASS: HTTP to HTTPS Insecure Transition in Form Post [10041] PASS: HTTPS to HTTP Insecure Transition in Form Post [10042] PASS: User Controllable JavaScript Event (XSS) [10043] PASS: Big Redirect Detected (Potential Sensitive Information Leak) [10044] PASS: Retrieved from Cache [10050] PASS: X-ChromeLogger-Data (XCOLD) Header Information Leak [10052] PASS: Cookie Without SameSite Attribute [10054] PASS: CSP Scanner [10055] PASS: X-Debug-Token Information Leak [10056] PASS: Username Hash Found [10057] PASS: X-AspNet-Version Response Header Scanner [10061] PASS: PII Disclosure [10062] PASS: Timestamp Disclosure [10096] PASS: Hash Disclosure [10097] PASS: Cross-Domain Misconfiguration [10098] PASS: Weak Authentication Method [10105] PASS: Reverse Tabnabbing [10108] PASS: Modern Web Application [10109] PASS: Absence of Anti-CSRF Tokens [10202] PASS: Private IP Disclosure [2] PASS: Session ID in URL Rewrite [3] PASS: Script Passive Scan Rules [50001] PASS: Insecure JSF ViewState [90001] PASS: Charset Mismatch [90011] PASS: Application Error Disclosure [90022] PASS: Loosely Scoped Cookie [90033] WARN-NEW: Incomplete or No Cache-control and Pragma HTTP Header Set [10015] x 6 https://example.com/login/ (200 OK) https://example.com/login/robots.txt (200 OK) https://example.com/login/sitemap.xml (200 OK) https://example.com/login/manifest.json (200 OK) https://example.com/login/static/css/2.73fa334c.chunk.css (200 OK) WARN-NEW: Content Security Policy (CSP) Header Not Set [10038] x 2 https://example.com/login/ (200 OK) https://example.com/login/sitemap.xml (200 OK) FAIL-NEW: 0 FAIL-INPROG: 0 WARN-NEW: 2 WARN-INPROG: 0 INFO: 0 IGNORE: 0 PASS: 49
診断結果として2つのwarningが検出されました。アラートについての詳細な説明は次のページに記載されています。
今回はレスポンスにCache-Control
やContent-Security-Policy
などのセキュリティヘッダーを含めていなかったため、脆弱性のリスクがあると判定されたようです。
今回のような構成でセキュリティヘッダーを追加する場合は次の記事を参考にLambda@Edgeを実装すると良いとのことなので試してみたいと思います。
おわりに
Docker版OWASP ZAPを使用してWebアプリのログインページの簡易的な脆弱性診断を行ってみました。
脆弱性診断というとセキュリティ企業に依頼して有料で行うイメージがありましたが、今回のようなオープンソースツールで簡単に実施できて、しかもちゃんと脆弱性を発見できることを知れたのは良かったです。
なお、AWSに対する脆弱性診断はポリシーに適合している場合を除いて許可されていないため、実施する場合は次のページを要確認の上ご自身の責任で行ってください。
参考
- 脆弱性診断・脆弱性検査ツール5選 | WRブログ
- Web脆弱性診断ツール「OWASP ZAP」とは | CyberSecurityTIMES
- OWASP ZAPの設定と使い方 | Qiita
- 脆弱性診断ツール OWASP ZAP vs 脆弱性だらけのWebアプリケーションEasyBuggy | Qiita
- Docker版OWASP ZAPを動かしてみる | Qiita
- ZAP Docker Documentation | ZAP
以上